package IHM;

import java.awt.*;
import java.math.BigDecimal;

import java.util.ArrayList;

import javax.swing.JPanel;
/**
 * Classe qui représente une couche graphiquement
 * @author philippestepniewski
 */
class Couche extends JPanel 
{
	private double[] activations;
	private ArrayList<ArrayList<Carre>> carres;
	private int posX, posY;
	private int cote;
        private int numero;
	
	/**
	 * Constructeur d'une couche. Attribution de la couleur en fonction de 
	 * la valeur d'activation.
	 * @param activations la liste des activations des neurones
	 */
	public Couche(double[] activations, int posX, int posY, int cote,int sizeX,int sizeY){
		this.activations = activations;
		this.posX = posX;
		this.posY = posY;
		this.cote = cote;
                this.setSize(sizeX, sizeY);
		carres = new ArrayList<ArrayList<Carre>>();
		remplirCouche();
		
	}

	/**
         * Rempli une couche avec les carrée représentant les neuronnes
         */
	public void remplirCouche(){
		int Yboucle = posY;
		int nbNeuronneCoteCouche=(int) Math.ceil(Math.sqrt(activations.length));
		
		int Xboucle=posX;
		int posDansActivation=0;
		ArrayList<Carre> carreligneboucle=new ArrayList<Carre>();
		for(int i=0;i<nbNeuronneCoteCouche;i++){
			Xboucle=posX;
			if(posDansActivation==activations.length-1){
				break;
			}
			for(int j=0;j<nbNeuronneCoteCouche;j++){
				if(posDansActivation<activations.length){
					Carre carre=creaCarre(activations[posDansActivation],cote, Xboucle,Yboucle);
					carreligneboucle.add(j, carre);
					Xboucle+=cote;
				}	
				posDansActivation++;
			}
			carres.add(i,carreligneboucle);
			Yboucle +=cote;
		}
	}
	
        /**
         * Crée un carrée. Calcul surtout la couleur en fonction de l'activation du neurone. Pondère la saturation de la couleur par l'activation
         * pour avoir un dégradé
         * @param activ activation du neurone
         * @param cote taille du carré
         * @param tempX position x du carré
         * @param Y position y du carré
         * @return un carré avec la couleur adéquate
         */
        public Carre creaCarre(double activ, int cote, int tempX,int Y){
		Color couleur;
                int decimalPlace=0;
                int coeff;
                if(activ > 0){
                                activ=activ*255;
                                BigDecimal bi = new BigDecimal(activ);
                                bi = bi.setScale(decimalPlace,BigDecimal.ROUND_DOWN);
                                coeff=bi.intValue();
				couleur = new Color(255,coeff,coeff);
		}
		else if(activ < 0){
                                activ=1+activ;
                                activ=activ*255;
                                BigDecimal bi = new BigDecimal(activ);
                                bi = bi.setScale(decimalPlace,BigDecimal.ROUND_DOWN);
                                coeff=bi.intValue();
                                couleur= new Color(coeff,coeff,255);
		}
                else{
                    couleur= new Color(255,255,255);
                }
		return new Carre(cote,tempX,Y,couleur);
	}

	
	/**
         *
         * @return la liste des carrée de la couche
         */
	public ArrayList<ArrayList<Carre>> getCarres(){
		return carres;
	}


	public void paintComponent(Graphics g) {
		for(ArrayList<Carre> l : carres)
			for(Carre c : l){
				g.setColor(c.getCouleur());
				g.fillRect(c.getX(), c.getY(), c.getCote(), c.getCote()); 	
			}
	}
        
        public void setNumero(int num){
            this.numero=num;
        }

        public int getNumero(){
            return this.numero;
        }
}



